/**
 * TypeScript 4.7 就支持了 infer 约束功能（ infer extends ） 来实现 对特定类型地提取
*/

/**
 * 在某些时候，可能对 infer 提取的类型值有些要求，
 * 比如只想要数组第一个为字符串的成员，如果第一个成员不是字符串，返回 never
*/
type FirstArrayItemType<T extends any[]> = T extends [infer P, ...any[]]
    ? P extends string
    ? P
    : never
    : never;

type Tmp1 = FirstArrayItemType<[599, 'hanxuming']>; // never
type Tmp2 = FirstArrayItemType<['hanxuming', 599]>; // 'hanxuming'
type Tmp3 = FirstArrayItemType<['hanxuming']>; // 'hanxuming'

//infer 约束功能（ infer extends ） 可以实现对特定类型地提取，上面的 FirstArrayItemType 可以改写为这样：
type FirstArrayItemTypeA<T extends any[]> = T extends [infer P extends string ? infer P : never, ...any[]] ? P : never;
type Tmp4 = FirstArrayItemTypeA<["hanxuming", 599]>;

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }